{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 304 Save and Reload\n",
    "\n",
    "\"\"\"\n",
    "View more, visit my tutorial page: https://mofanpy.com/tutorials/\n",
    "My Youtube Channel: https://www.youtube.com/user/MorvanZhou\n",
    "\n",
    "Dependencies:\n",
    "* torch: 0.1.11\n",
    "* matplotlib"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<torch._C.Generator at 0x7f931012a918>"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import torch\n",
    "from torch.autograd import Variable\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "\n",
    "torch.manual_seed(1)    # reproducible"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Generate some fake data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "x = torch.unsqueeze(torch.linspace(-1, 1, 100), dim=1)  # x data (tensor), shape=(100, 1)\n",
    "y = x.pow(2) + 0.2*torch.rand(x.size())  # noisy y data (tensor), shape=(100, 1)\n",
    "x, y = Variable(x, requires_grad=False), Variable(y, requires_grad=False)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def save():\n",
    "    # save net1\n",
    "    net1 = torch.nn.Sequential(\n",
    "        torch.nn.Linear(1, 10),\n",
    "        torch.nn.ReLU(),\n",
    "        torch.nn.Linear(10, 1)\n",
    "    )\n",
    "    optimizer = torch.optim.SGD(net1.parameters(), lr=0.5)\n",
    "    loss_func = torch.nn.MSELoss()\n",
    "\n",
    "    for t in range(100):\n",
    "        prediction = net1(x)\n",
    "        loss = loss_func(prediction, y)\n",
    "        optimizer.zero_grad()\n",
    "        loss.backward()\n",
    "        optimizer.step()\n",
    "\n",
    "    # plot result\n",
    "    plt.figure(1, figsize=(10, 3))\n",
    "    plt.subplot(131)\n",
    "    plt.title('Net1')\n",
    "    plt.scatter(x.data.numpy(), y.data.numpy())\n",
    "    plt.plot(x.data.numpy(), prediction.data.numpy(), 'r-', lw=5)\n",
    "\n",
    "    # 2 ways to save the net\n",
    "    torch.save(net1, 'net.pkl')  # save entire net\n",
    "    torch.save(net1.state_dict(), 'net_params.pkl')   # save only the parameters"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def restore_net():\n",
    "    # restore entire net1 to net2\n",
    "    net2 = torch.load('net.pkl')\n",
    "    prediction = net2(x)\n",
    "\n",
    "    # plot result\n",
    "    plt.subplot(132)\n",
    "    plt.title('Net2')\n",
    "    plt.scatter(x.data.numpy(), y.data.numpy())\n",
    "    plt.plot(x.data.numpy(), prediction.data.numpy(), 'r-', lw=5)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def restore_params():\n",
    "    # restore only the parameters in net1 to net3\n",
    "    net3 = torch.nn.Sequential(\n",
    "        torch.nn.Linear(1, 10),\n",
    "        torch.nn.ReLU(),\n",
    "        torch.nn.Linear(10, 1)\n",
    "    )\n",
    "\n",
    "    # copy net1's parameters into net3\n",
    "    net3.load_state_dict(torch.load('net_params.pkl'))\n",
    "    prediction = net3(x)\n",
    "\n",
    "    # plot result\n",
    "    plt.subplot(133)\n",
    "    plt.title('Net3')\n",
    "    plt.scatter(x.data.numpy(), y.data.numpy())\n",
    "    plt.plot(x.data.numpy(), prediction.data.numpy(), 'r-', lw=5)\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\ngg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f92d43e7cc0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# save net1\n",
    "save()\n",
    "# restore entire net (may slow)\n",
    "restore_net()\n",
    "# restore only the net parameters\n",
    "restore_params()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
